/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package runebound.manejadores;

import javax.swing.JDialog;
import javax.swing.JOptionPane;
import runebound.combate.LineaRegistro;
import runebound.combate.LineaRegistroString;
import runebound.combate.RBRegistroInformacion;
import runebound.manejadores.aventura.RBControladorAventura;
import runebound.manejadores.eventos.RBEventoJuego;
import runebound.modelo.heores.Heroe;
import runebound.modelo.monstruos.Monstruo;
import runebound.ui.RBWindow;
import runebound.ui.combate.RBCombateFrame;
import runebound.ui.mapa.EstadoTileMapa;
import runebound.ui.mapa.RBMapaPanel;
import runebound.ui.mapa.TileMapa;

/**
 * Clase encargada de la secuencia del turno.
 * @author Miguel (alakat@gmail.com)
 */
public class RBControladorJuego {
    private final int PUNTO_EXPERIENCIA_NIVEL_DEV=1;
    private final int PUNTO_EXPERIENCIA_NIVEL_FACIL=4;
    private final int PUNTO_EXPERIENCIA_NIVEL_MEDIO=5;
    private static RBControladorJuego instance = null;
    private final RBMaquinaEstadosJuego controladorEventos;
    private RBWindow window;
    private RBControladorCombate controladorCombate;
    private RBControladorAventura controladorAventura;
    private Heroe heroeActivo;
    private TileMapa TALAMIR;
    private final int puntoDeExperienciaPorNivel;

    public RBControladorJuego() {
        this.controladorEventos= new RBMaquinaEstadosJuego(this);
        this.heroeActivo=new Heroe();
        //TODO gestión de heroe
        this.heroeActivo.setNombre("Mordrog");
        this.heroeActivo.setDescripcion("Puedes llamarme Bestia! Puedes llamarme animal! Pero yo puedo llamarte cobarde");
        this.heroeActivo.setVida(6);
        this.heroeActivo.setFatiga(3);
        this.heroeActivo.setValorFisico(5);
        this.heroeActivo.setValorMente(1);
        this.heroeActivo.setValorMagia(1);
        this.heroeActivo.setFuerzaFisico(2);
        this.heroeActivo.setFuerzaMagia(1);
        this.heroeActivo.setFuerzaMente(1);
        this.heroeActivo.hit(1);
        this.heroeActivo.ampliarOro(20);
        this.puntoDeExperienciaPorNivel = PUNTO_EXPERIENCIA_NIVEL_FACIL;
        this.controladorAventura = new RBControladorAventura();
    }

    public static RBControladorJuego getInstance() {
        if(instance==null){
            instance = new RBControladorJuego();
        }
        return instance;
    }
    
    
    public void recibirEvento(RBEventoJuego evento){
        RBRegistroInformacion.getInstance().registro(new LineaRegistroString(evento.toString()));
        new Thread(()->{
            controladorEventos.recibirEvento(evento);
        }).start();
        
        
    }

    public RBWindow getWindow() {
        return window;
    }

    public void setWindow(RBWindow window) {
        this.window = window;
        this.TALAMIR = window.getMapaPanel().getTile(4,6);
        //TODO DELETE
        RBMapaPanel mapa = this.getWindow().getMapaPanel();
        mapa.setTileActivo(TALAMIR);
        TALAMIR.setEstado(EstadoTileMapa.HEROE_ACTIVO);
        TALAMIR.getHeroe().add(this.getHeroeActivo());
            //fin del delete
        nuevoTurno();
    }

    /**
     * Inicializa el juego para un nuevo turno
     * Cambio de heroe activo
     */
    public void nuevoTurno() {
        this.getWindow().getRBDadosMovimientoPanel().setNuevoTurno();
        this.window.getrBHeroePanel1().activeHeroe(this.heroeActivo);
    }

    public Heroe getHeroeActivo() {
        return heroeActivo;
    }

    
    public void nuevoCombate(Heroe heroe, Monstruo monstruo){
        RBCombateFrame frame = new RBCombateFrame();
        this.controladorCombate = new RBControladorCombate(heroe, monstruo, frame);
        
        
    }
    
    public RBControladorCombate getControladorCombate() {
        return controladorCombate;
    }

    public RBControladorAventura getControladorAventura() {
        return controladorAventura;
    }

    /**
     * Información al controlador del juego de la muerte de un héroe
     * @param heroe 
     */
    void muerteHeroe(Heroe heroe) {
        JOptionPane.showMessageDialog(this.getWindow(), this.heroeActivo.getNombre()+" ha muerto, pierdes la mitad de tu oro, el objeto más valiso y te mueves a Talamir");
        this.heroeActivo.recuperarAll();
        this.getWindow().getMapaPanel().getTileActivo().getHeroe().remove(this.heroeActivo);
        this.TALAMIR.getHeroe().add(heroeActivo);
        this.getWindow().repaint();
        
    }

    /**
     * Comprueba si es necesario subir nivel con el heroe
     * @return 
     */
    public boolean isSubirNivel() {
        return this.heroeActivo.getPuntosExperiencia()>=this.puntoDeExperienciaPorNivel;
    }

    /**
     * 
     * @return 
     */
    public int getPuntoDeExperienciaPorNivel() {
        return puntoDeExperienciaPorNivel;
    }
    
    
    
    
    
    
}
